package frpc.manager.set;

import frpc.manager.basics.IRedisBusinessManager;
import frpc.manager.operation.GiveCacheData;
import org.springframework.data.redis.core.SetOperations;

import java.util.Collection;
import java.util.Set;

/**
 * 类描述:  Redis——Set集合处理接口
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2022/6/2 0002 下午 3:12
 */
public interface IRedisSetManager extends IRedisBusinessManager {

    /**
     * 功能描述：获取Set处理对象完成自定义处理
     *
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> SetOperations<String, T> giveSetOperations();

    /**
     * 功能描述：添加数据到指定的Key中
     *
     * @param key   需要插入的Key
     * @param value 需要插入的内容
     * @param time  失效时间，单位：秒
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addValueByKey(String key, T value, long time);

    /**
     * 功能描述：添加数据到指定的Key中，不限制时间
     *
     * @param key   需要插入的Key
     * @param value 需要插入的内容
     * @author : 王雷
     * @date : 2022/6/2 0002 下午 3:12
     */
    <T> void addValueByKey(String key, T value);

    /**
     * 获取数据
     *
     * @param key 键
     * @return 值
     */
    <T> Set<T> giveValueByKey(String key);

    /**
     * 删除Set表中的值
     *
     * @param key  键 不能为null
     * @param item 项 可以使多个 不能为null
     */
    <T> void sdel(String key, T... item);

    /**
     * 判断Set表中是否有该项的值
     *
     * @param key  键 不能为null
     * @param item 项 不能为null
     * @return true 存在 false不存在
     */
    <T> boolean sHasKey(String key, T item);

    /**
     * 功能描述：获取存储的长度
     *
     * @param key 存储主键
     * @author : 王雷
     * @date : 2019/10/17 0017 下午 1:58
     */
    long giveSetSize(String key);

    /**
     * 功能描述：Set集合交集运算
     *
     * @param key  目标Key
     * @param keys 需要对比的Key
     * @return : 交集结果
     * @author : 王雷
     * @date : 2020/11/28 0028 下午 6:04
     */
    <T> Set<T> intersectionOperation(String key, String... keys);

    /**
     * 功能描述：Set集合交集运算并将结果放入到新的集合中
     *
     * @param key     目标Key
     * @param destKey 新目标Key
     * @param keys    需要对比的Key
     * @return : 交集结果数量
     * @author : 王雷
     * @date : 2020/11/28 0028 下午 6:04
     */
    long intersectionOperation(String key, String destKey, String... keys);

    /**
     * 功能描述：Set集合并集运算
     *
     * @param key  目标Key
     * @param keys 需要对比的Key
     * @return : 交集结果
     * @author : 王雷
     * @date : 2020/11/28 0028 下午 6:04
     */
    <T> Set<T> unionSetOperation(String key, String... keys);

    /**
     * 功能描述：Set集合并集运算并将结果放入到新的集合中
     *
     * @param key     目标Key
     * @param destKey 新目标Key
     * @param keys    需要对比的Key
     * @return : 交集结果数量
     * @author : 王雷
     * @date : 2020/11/28 0028 下午 6:04
     */
    long unionSetOperation(String key, String destKey, String... keys);

    /**
     * 功能描述：Set集合差集运算
     *
     * @param key  目标Key
     * @param keys 需要对比的Key
     * @return : 交集结果
     * @author : 王雷
     * @date : 2020/11/28 0028 下午 6:04
     */
    <T> Set<T> differenceSetOperation(String key, String... keys);

    /**
     * 功能描述：Set集合差集运算并将结果放入到新的集合中
     *
     * @param key     目标Key
     * @param destKey 新目标Key
     * @param keys    需要对比的Key
     * @return : 交集结果数量
     * @author : 王雷
     * @date : 2020/11/28 0028 下午 6:04
     */
    long differenceSetOperation(String key, String destKey, String... keys);

    /**
     * 功能描述：随机提取Set集合中的数据
     *
     * @param key          目标Key
     * @param size         提取数据的长度
     * @param isDeleteData 是否删除提取的数据
     * @return : 提取的结果
     * @author : 王雷
     * @date : 2020/11/28 0028 下午 6:22
     */
    <T> Collection<T> giveDataToRandom(String key, long size, boolean isDeleteData);

    /**
     * 功能描述：获取数据，带锁处理
     *
     * @param key           需要查询的Key
     * @param giveCacheData 需要执行的回调函数
     * @param putMaxTime    存储的时间
     * @return : 结果
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2020/11/30 0030 下午 7:51
     */
    <T> Set<T> giveValueByKeyToLock(String key, GiveCacheData<Set<T>> giveCacheData, Long putMaxTime) throws Exception;

    /**
     * 功能描述：获取数据，带锁处理
     *
     * @param key           需要查询的Key
     * @param giveCacheData 需要执行的回调函数
     * @return : 结果
     * @throws Exception 执行异常
     * @author : 王雷
     * @date : 2020/11/30 0030 下午 7:51
     */
    <T> Set<T> giveValueByKeyToLock(String key, GiveCacheData<Set<T>> giveCacheData) throws Exception;
}
